export function throttle(fn: (...args: any[]) => any, delay: number = 200) {
    let timer: number | null = null
    return function (this: any, ...args: any[]) {
        // 如果已经有定时器了，那么就退出
        if (timer) return
        // 获取debounce执行作用域的this
        // 获取debounce执行作用域的this  this指向是动态的，无法确定其类型， 
        // ts官方给的解决方案 在this所在的函数，加一个假参数this，假参数this 运行时，会自动的拿掉
        let _this = this
        // 获取参数
        // let args = [...arguments]

        // ts中 这种定时器要全局对象补全， 因为 node下也有setTimeout方法，返回值类型 和window.setTimeout类型不一致  
        timer = window.setTimeout(function () {
            // 改变执行函数内部的this指向debounce执行作用域的this，并把参数传给执行函数
            fn.apply(_this, args)
            // 在delay后执行完fn之后清空timer，此时timer为假，throttle触发可以进入计时器
            timer = null
        }, delay)
    }
}